package com.peycard.listener;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.peycard.common.util.BadConfigurationException;
import com.solab.iso8583.MessageFactory;

public class ISODaemon implements Runnable{

	private static Logger LOGGER = LoggerFactory.getLogger(ISODaemon.class);
	
	private ServerSocket server;
	private MessageFactory mfact;	

	public ISODaemon(MessageFactory mfact){
		LOGGER.debug(":: CREANDO OBJETO ISO DAEMON ::");
		this.mfact = mfact;	
	}

	@Override
	public void run() {
		LOGGER.debug("METODO RUN DE ISODAEMON");
		try {
			server = new ServerSocket(9798);			
			while (true) {
				LOGGER.debug("TRUE:::: NUEVA CONEXION HACIA SOCKET EN ISO_DAEMON");
				Socket sock = server.accept();
				LOGGER.debug("SE HA ACEPTADO UNA NUEVA CONEXION HACIA EL SERVER");
				System.err.println(String.format("New connection from %s:%d",
						sock.getInetAddress(), sock.getPort()));
				//LOGGER.debug("SE ESTA SETTEANDO EL SOCKET EN EL ISO SERVER BEAN");
				//isoServerBean.setSocket(sock);
				//LOGGER.debug("INVOCANDO AL ISO SERVER BEAN EL DOISOWORK");
				ISOServer2 isoServer = new ISOServer2(sock, mfact);
				Thread isoThread = new Thread(isoServer, "ISO-DAEMON-THREAD");
				isoThread.start();
			}
		} catch (IOException e) {
			throw new BadConfigurationException("NO SE PUEDE ACTIVAR LISTENER DE MSJS ISO", e);
		}
		
	}

	public void abort(){
		try {
			getServer().close();
		} catch (IOException e) {
			LOGGER.error("NO SE PUEDE CERRAR EL SOCKET", e);
		}
	}
	
	/**
	 * @return el server
	 */
	public ServerSocket getServer() {
		return server;
	}

	/**
	 * @param server el server a establecer
	 */
	public void setServer(ServerSocket server) {
		this.server = server;
	}		
	
}
